package fr.miage.course7.gps;

import java.util.GregorianCalendar;
import java.util.TreeSet;

/**
 * Classe représentant un participant.
 * @author Mickael LAROCHE
 *
 */
public class Participant {

    /**
     * Classe enumeratrice de categorie.
     * @author Mickael LAROCHE
     *
     */
    public enum Categorie {
        /** Defini un catamaran. */
        catamaran,
        /** Defini un monocoque. */
        monocoque,
        /** Defini un trimaran. */
        trimaran;
    }

    /**
     * Identificant du participant.
     */
    private int identifiant;

    /**
     * Categorie du participant.
     */
    private Categorie categorie;

    /**
     * Nom du bateau.
     */
    private String nomBateau;

    /**
     * Nom du skipper.
     */
    private String nomSkipper;

    /**
     * Numero de l'étape courante.
     */
    private int derniereEtape = 0;

    /**
     * Liste des transmissions.
     */
    private TreeSet<Transmission> transmissions;


    /**
     * Constructeur.
     * @param id identifiant
     * @param c catégorie
     * @param bat nom du bateau
     * @param skip nom du skipper
     */
    public Participant(final int id,
                       final Categorie c,
                       final String bat,
                       final String skip) {

        identifiant = id;
        categorie = c;
        nomBateau = bat;
        nomSkipper = skip;
        transmissions = new TreeSet<Transmission>();
    }

    /**
     * Retourne l'identifiant du participant.
     * @return l'identifiant du participant
     */
    public final int getIdentifiant() {
        return identifiant;
    }

    /**
     * Ajoute une nouvelle transmission.
     * @param date : date de la transmission
     * @param lat : latitude de la transmission
     * @param lon : longitude de la transmission
     * @param incEtape : nombre d'étapes passés depuis ce point
     * @return la transmission
     */
    public final Transmission nouvelleTransmission(final GregorianCalendar date,
                                                   final int lat, final int lon,
                                                   final int incEtape) {
        derniereEtape = derniereEtape + incEtape;
        Transmission temp = new Transmission(identifiant, date, lat, lon);
        transmissions.add(temp);
        return temp;
    }

    /**
     * Retourne la dernière étape.
     * @return la dernière étape
     */
    public final int getDerniereEtape() {
        return derniereEtape;
    }

    /**
     * Incrémente le numéro de l'étape.
     */
    public final void incEtape() {
        ++derniereEtape;
    }

    /**
     * Retourne la position de la dernière transmission.
     * @return la position de la dernière transmission
     */
    public final Position getDernierePosition() {
        return transmissions.last().getCoord();
    }

    /**
     * Retourne la date de la dernière transmission.
     * @return la date de la dernière transmission
     */
    public final GregorianCalendar getDerniereDate() {
        return transmissions.last().getDate();
    }

    /**
     * Affichage.
     * @return la classe sous forme de String
     */
    @Override
    public final String toString() {
        return getClass().getSimpleName() + '@'
                + Integer.toHexString(hashCode())
                + " [categorie=" + categorie + ", identifiant="
                + identifiant + ", nomBateau=" + nomBateau + ", nomSkipper="
                + nomSkipper + ", derniereEtape=" + derniereEtape
                + ", transmission=" + transmissions + "]";
    }

    /**
     * Affichage XML.
     * @return la classe sous forme de document XML
     */
    public final String toXML() {
        return "<participant id='" + identifiant + "'"
             + "  categorie='" + categorie + "'"
             +  "  nomBateau='" + nomBateau + "'"
             +  "  nomSkipper='" + nomSkipper + "'"
             +  "  derniereEtape='" + derniereEtape + "'"
             +  " />";
    }

    /**
     * Retourne la liste des transmissions.
     * @return la liste des transmissions
     */
    public final TreeSet<Transmission> getTransmissions() {
        return transmissions;
    }

    /**
     * Retourne la dernière transmission.
     * @return la dernière transmission
     */
    public final Transmission getDerniereTransmission() {
        return transmissions.last();
    }

}
